package controller;

import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

import mapelements.MapElement;

import advance.GameMap;

import errors.StratumNotFoundException;
import event.numberevent.StateNumber;
import gui.Display;

import controller.states.MapElementToAddStateUser;


/**rappresenta un oggetto che contiene
 * le informazioni su come inserire un
 * determinato oggetto nella mappa.
 * <p>Per esempio inserire un MapObject e' diverso dall'inserire un
 * MapLayer; esisteranno quindi 2 classi figlie di questa per dire
 * chiaramente come questi 2 oggetti vanno inseriti.
 * <p>un adder deve, quando è completata la sua azione base, passare dallo stato
 * classChoosen a classAdded
 * 
 * <TOADD> indica il tipo dell'oggetto da inserire nella mappa
 * 
 * @author Koldar
 * @version 1.3
 */
public abstract class ObjectAdderInformationContainer<TOADD extends MapElement> {
	
	/**rappresenta la classe dell'oggetto che va inserito nella mappa*/
	protected TOADD objectToAdd;
	/**rappresenta il costruttore da usare per costruire la nuova classe*/
	/**indica il pannello in cui {@link #objectToAdd} va inserito*/
	protected Display whereToAdd;
	/**indica la mappa in cui tale oggetto va inserito*/
	protected GameMap map;
	
	public ObjectAdderInformationContainer(Display whereToAdd,TOADD _objectToAdd,GameMap map){
		this.objectToAdd=_objectToAdd;
		this.whereToAdd=whereToAdd;
		this.map=map;
	}
	
	/**imposta i valori importanti per la corretta esecuzione della classe
	 * 
	 * @param newdisplay
	 * @param newobjecttoadd
	 * @param newmap
	 */
	protected void setNeededInformations(Display newdisplay,TOADD newobjecttoadd,GameMap newmap){
		this.objectToAdd=newobjecttoadd;
		this.whereToAdd=whereToAdd;
		this.map=map;
	}

	public abstract void doubleClick(MouseEvent arg0) throws StratumNotFoundException;
	
	public abstract void leftClick(MouseEvent arg0) throws StratumNotFoundException;

	public abstract void rightClick(MouseEvent arg0) throws StratumNotFoundException;

	public abstract void unknownClick(MouseEvent arg0) throws StratumNotFoundException;

	public abstract void enterTyped(KeyEvent arg0) throws StratumNotFoundException;

	public abstract void escTyped(KeyEvent arg0) throws StratumNotFoundException;

	public abstract void unkwnownTyped(KeyEvent arg0) throws StratumNotFoundException;

	/**
	 * @return the map
	 */
	public GameMap getMap() {
		return map;
	}

	/**
	 * @param map the map to set
	 */
	public void setMap(GameMap map) {
		this.map = map;
	}



	/**
	 * @return the objectToAdd
	 */
	public TOADD getObjectToAdd() {
		return objectToAdd;
	}

	/**
	 * @param objectToAdd the objectToAdd to set
	 */
	public void setObjectToAdd(TOADD objectToAdd) {
		this.objectToAdd = objectToAdd;
	}
	
	/**termina tutti i thread ausiliari di questa classe usati per inserire oggetti
	 * dentro la mappa
	 * 
	 */
	public void terminateAuxiliarThreads(){
		this.objectToAdd.terminate();
	}
	
	public void finalize(){
		this.objectToAdd.terminate();
	}
	
	
}
